exports.addApplicationTemplate = function(req,res){

    //参数获取
    var bodyParams = req.routeInfo.bodyParams;

    //新增的模板ID
    var cmat_id = 0;

    //用户网络信息
    var networkInfo = {};

    //应用信息
    var applicationData = {};

    //可用ip组
    var ipArr = [];

    //可用端口组
    var portArr = [];

    //模板容器ip
    var templateIp = 0;

    //模板容器端口
    var templatePort = 0;

    //模板容器的主键ID
    var containerId = 0;

    //判断该用户是否已经为该应用添加过该模板
    function isTemplateUsed(cb){

        R.SEND_HTTP(
            req,
            res,
            {
                url    : CORE_APIConfig.coreAPI.easydCloudMemberApplicationTemplateSearch.Request_Api_Url + "/cmat_cmaid/" + bodyParams.cmat_cmaid + "/cmat_ctsid/" + bodyParams.cmat_ctsid + "/cmat_is_delete/0",  
                method : 'POST',
                data   : {
                    fields : "cmat_id"
                }
            },
            function (data) {

                if(data.result.data.length > 0){
                   return RES.errorResponse(res,"抱歉，已为该应用添加过该模板，您可以直接在已有模板中进行管理");  
                }

                cb();

            }
        )
        

    }

    //新增用户应用模板
    function addUserApplicationTemplate(cb){

        R.SEND_HTTP(
            req,
            res,
            {
                url    : CORE_APIConfig.coreAPI.easydCloudMemberApplicationTemplateAdd.Request_Api_Url,  
                method : 'POST',
                data   : {
                    cmat_cmaid       : bodyParams.cmat_cmaid,
                    cmat_uid         : bodyParams.cmat_uid,
                    cmat_ctsid       : bodyParams.cmat_ctsid,
                    cmat_create_time : bodyParams.cmat_create_time,
                    cmat_is_cloud_service : bodyParams.cmat_is_cloud_service
                }
            },
            function (data) {

                //保存模板主键ID
                cmat_id = data.result;

                cb();

            }
        )
    }

    //获取用户网络信息
    function getUserNetworkInfo(cb){

        //非云部署直接完成用户应用模板的添加，此类型的模板只可下载使用
        if(bodyParams.cmat_is_cloud_service != '1'){
            return cb(true);
        }

        //获取该用户的网络信息
        R.SEND_HTTP(
            req,
            res,
            {
                url    : CORE_APIConfig.coreAPI.easydCloudNetworkUsedSearch.Request_Api_Url + "/cnu_uid/" + bodyParams.cmat_uid,  
                method : 'GET'
            },
            function (data) {

                networkInfo = data.result.data[0];

                //创建可用IP数组
                for(var i = 2; i <= 254; i++){
                    var ip = networkInfo.cnu_ip_1 + "." + networkInfo.cnu_ip_2 + "." + networkInfo.cnu_ip_3 + "." + i
                    ipArr.push(ip)
                }   

                //创建可用端口数组
                for(var i = parseInt(networkInfo.cnu_start_port);i<parseInt(networkInfo.cnu_end_port);i++){
                    portArr.push(i)
                }

                cb();

            }
        )
    }

    /*
     * 获取用户已使用的端口以及IP地址
     */
    function searchUserUsedIpAndPort(cb){

        R.SEND_HTTP(
            req,
            res,
            {
                url    : CORE_APIConfig.coreAPI.easydCloudMemberApplicationContainerSearch.Request_Api_Url + "/cmac_uid/" + bodyParams.cmat_uid,  
                method : 'GET'
            },
            function (data) {

                //获取用户的已使用IP和端口
                var usedIpArr   = [];
                var usedPortArr = [];

                var usedData = data.result.data;

                for(var i=0;i<usedData.length;i++){

                    //保存已使用的IP地址
                    var ip = usedData[i].cmac_ip;
                    usedIpArr.push(ip);

                    //保存已使用的端口号
                    usedPortArr.push(usedData[i].cmac_out_port)

                }

                //去除已使用的IP和端口号，形成新的IP和端口数组池
                var noUsedIpArr   = common.arrToHeavy(ipArr,usedIpArr)
                var noUsedPortArr = common.arrToHeavy(portArr,usedPortArr)

                //取出前1个可以用的IP和端口，等待分配使用
                templateIp   = noUsedIpArr[0];
                templatePort = noUsedPortArr[0];

                cb();

            }
        )

    }


    //获取应用的详细信息
    function getApplicationDetail(cb){

        R.SEND_HTTP(
            req,
            res,
            {
                url    : CORE_APIConfig.coreAPI.easydCloudMemberApplicationSearch.Request_Api_Url + "/cma_id/" + bodyParams.cmat_cmaid,  
                method : 'GET'
            },
            function (data) {

                applicationData = data.result.data[0];

                cb();

            }
        )

    }

    /*
     * 将选择的模板创建到用户的主项目目录
     */
    function createTemplateApplicationBussiness(cb){

        //根据模板的类型获取相对应的目录
        var typeStr = "";

        if(bodyParams.template_type == 0){
            typeStr = "pc"
        }else if(bodyParams.template_type == 1){
            typeStr = "h5"
        }else{
            return RES.errorResponse(res,"抱歉，暂时不支持该类型的模板进行云部署使用");  
        }

        //模板目录
        var productDir = "/templateData/" + typeStr + "/" + bodyParams.template_id + "/.";

        //用户应用目录
        var userApplicationDir = "/UserApplication/"+bodyParams.username+"/"+applicationData.cma_app_key+"/templateServer/" + bodyParams.template_id;

        R.Ssh_exec_dockerCommand(`${DockerSH.CopyAppBussinessTemplate} ${productDir} ${userApplicationDir}`,function(rs){

            if(rs.length > 0){
                return RES.errorResponse(res,"用户应用管理层项目创建失败，请重新尝试");  
            }else{
                cb();
            }

        })


    }


    /*
     * 创建管理层服务容器
     * 容器参数解析：
     * 参数1：端口号
     * 参数2：容器名称
     * 参数3：加入的用户网络
     * 参数4：容器Ip
     * 参数5：用户主项目目录
     */
    function createTemplateContainer(cb){

        var dockerParams = [
            templatePort,
            applicationData.cma_app_key + "_template_" + bodyParams.template_id,
            networkInfo.cnu_network_name,
            templateIp,
            bodyParams.username + "/" + applicationData.cma_app_key + "/templateServer/" + bodyParams.template_id
        ].join(" ");

        R.Ssh_exec_dockerCommand(`${DockerSH.CreateTemplateLayerAppContainer} ${dockerParams}`,function(rs){

            if(rs.indexOf('Error') != -1){

                return RES.errorResponse(res,"用户模板服务创建失败，请重新尝试");  

            }else{

                cb();
            }

        })
    }

    //保存应用聚合层容器信息
    function createTemplateContainerRecord(cb){

        R.SEND_HTTP(
            req,
            res,
            {
                url    : CORE_APIConfig.coreAPI.easydCloudMemberApplicationContainerAdd.Request_Api_Url,  
                method : 'POST',                    
                data   : {
                    cmac_name        : applicationData.cma_app_key + "_template_" + bodyParams.template_id,
                    cmac_ip          : templateIp,
                    cmac_in_port     : '80',
                    cmac_out_port    : templatePort,
                    cmac_network     : networkInfo.cnu_network_name,
                    cmac_cmaid       : bodyParams.cmat_cmaid,
                    cmac_create_time : common.nowTime(false),
                    cmac_uid         : bodyParams.cmat_uid,
                    cmac_type        : '1'

                }
            },
            function (data) {

                //保存容器的主键ID
                containerId = data.result;

                cb();

            }
        )
    }

    //更新容器信息到用户模板记录
    function updateContainerUserTemplateRecord(cb){

        R.SEND_HTTP(
            req,
            res,
            {
                url    : CORE_APIConfig.coreAPI.easydCloudMemberApplicationTemplateUpdate.Request_Api_Url,  
                method : 'POST',                    
                data   : {
                    update_where  : 'cmat_id',
                    cmat_id       : cmat_id,
                    cmat_cmacid   : containerId
                }
            },
            function (data) {

                cb();

            }
        )

    }

    F.Serial([
        isTemplateUsed,
        addUserApplicationTemplate,
        getUserNetworkInfo,
        searchUserUsedIpAndPort,
        getApplicationDetail,
        createTemplateApplicationBussiness,
        createTemplateContainer,
        createTemplateContainerRecord,
        updateContainerUserTemplateRecord
    ],() => {
        RES.successResponse(res);
    })

}